/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package vetxsoft.bean;

import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import vetxsoft.entity.Cliente;
import vetxsoft.entity.DetalleProcedimiento;
import vetxsoft.entity.DetalleProcedimientoPK;
import vetxsoft.entity.HistoriaClinica;
import vetxsoft.entity.Procedimiento;
import vetxsoft.system.IVetexsoftSystem;

/**
 *
 * @author Nother
 */
@ManagedBean
@SessionScoped
public class ProcedimientoBean {

    @EJB
    private IVetexsoftSystem vetexsoftSystem;
    Procedimiento procedimiento = new Procedimiento();
    private Cliente cliente;
    private DetalleProcedimiento detalleProcedimiento = new DetalleProcedimiento();
    private LinkedList<DetalleProcedimiento> detalleProcedimientos = new LinkedList<DetalleProcedimiento>();
    private HistoriaClinica historiaClinica = new HistoriaClinica();
    private Date currentDate = new Date();
    private boolean stored = false;

    public void cancelSelectionCliente() {

        this.cliente = (null);
    }

    public Procedimiento getProcedimiento() {
        return procedimiento;
    }

    public Cliente getCliente() {
        return cliente;
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    
    public DetalleProcedimiento getDetalleProcedimiento() {
        return detalleProcedimiento;
    }

    public LinkedList<DetalleProcedimiento> getDetalleProcedimientos() {
        return detalleProcedimientos;
    }

    public void cancelSelectionProducto() {

        this.detalleProcedimiento.setProducto(null);
    }

    public HistoriaClinica getHistoriaClinica() {
        return historiaClinica;
    }

    public void setHistoriaClinica(HistoriaClinica historiaClinica) {
        this.historiaClinica = historiaClinica;
    }

    public boolean isStored() {
        return stored;
    }

    public void setStored(boolean stored) {
        this.stored = stored;
    }

    public Date getCurrentDate() {
        return currentDate;
    }

    public void setProcedimiento(Procedimiento procedimiento) {
        this.procedimiento = procedimiento;
    }

    public void setDetalleProcedimiento(DetalleProcedimiento detalleProcedimiento) {
        this.detalleProcedimiento = detalleProcedimiento;
    }

    public void setDetalleProcedimientos(LinkedList<DetalleProcedimiento> detalleProcedimientos) {
        this.detalleProcedimientos = detalleProcedimientos;
    }

    public IVetexsoftSystem getVetexsoftSystem() {
        return vetexsoftSystem;
    }

    
    public void addDetalleAction() {

        if (this.detalleProcedimiento.getCantidad() <= 0) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "La cantidad no puede ser menor o igual a cero.", ""));
            return;
        }

        if (this.detalleProcedimiento.getProducto() == null) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Debes seleccionar una cantidad.", ""));
            return;
        }

        for (DetalleProcedimiento dp : this.detalleProcedimientos) {
            if (dp.getProducto().getDescripcion().equalsIgnoreCase(this.detalleProcedimiento.getProducto().getDescripcion())) {

                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Este procedimiento ya ha sido ingresado. Debes seleccionar otro.", ""));
                return;
            }
        }

        this.detalleProcedimientos.add(detalleProcedimiento);

        this.detalleProcedimiento = new DetalleProcedimiento();

    }
    
     public void returnDetalle() {

        this.detalleProcedimientos.remove(detalleProcedimiento);
        this.detalleProcedimiento = new DetalleProcedimiento();
    }
     
     public void saveAction() {
        try {

            if (this.detalleProcedimientos.isEmpty()) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Debes seleccionar un producto.", ""));
                return;
            }

            // guardamos el procedimiento
            this.procedimiento.setStored(this.stored);
            this.vetexsoftSystem.saveProcedimiento(this.procedimiento);

            // obtenemos el ultimo procedimiento guardado, el cual nos proporcionará el codigo generado automaticamente
            List<Procedimiento> facturas = this.vetexsoftSystem.obtenerProcedimiento();
            this.procedimiento = facturas.get(facturas.size() - 1);

            // guardamos la historia clinica
            this.vetexsoftSystem.saveHistoriaClinica(this.historiaClinica);

            // guardamos todos los detalles de procedimientos registrados
            for (DetalleProcedimiento dp : this.detalleProcedimientos) {

                dp.setDetalleProcedimientoPK(new DetalleProcedimientoPK(this.procedimiento.getCodigo(), dp.getProducto().getCodigo()));
                this.vetexsoftSystem.saveDetalleProcedimiento(dp);
            }

            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "El procedimiento ha sido registrado satisfactoriamente.", ""));

            this.procedimiento = new Procedimiento();
            this.detalleProcedimiento = new DetalleProcedimiento();
            this.detalleProcedimientos = new LinkedList<DetalleProcedimiento>();
            this.historiaClinica = new HistoriaClinica();
            this.cliente = null;
            this.stored = false;

        } catch (Exception ex) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "No se ha podido registrar el procedimiento. Por favor, vuelva a intentarlo.", ""));
        }
    }
     
         public void cancelAction() {

        this.procedimiento = new Procedimiento();
        this.detalleProcedimiento = new DetalleProcedimiento();
        this.detalleProcedimientos = new LinkedList<DetalleProcedimiento>();
        this.historiaClinica = new HistoriaClinica();
        this.cliente = null;
        this.stored = false;
    }
}
